﻿using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Interface.DAL
{
    /// <summary>
    /// 拓展元数据表操作类接口
    /// </summary>
    public interface IMeta
    {
        #region 增加记录
        /// <summary>
        /// 向拓展元数据表中插入一行新数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="meta">要插入的对象</param>
        /// <returns>执行结果受影响行数</returns>
        int Insert(Meta meta);
        #endregion

        #region 删除记录

        #region 删除一条数据
        /// <summary>
        /// 根据元数据ID删除对应的元数据记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除记录的元数据ID</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int id);
        #endregion

        #region 删除多条数据
        /// <summary>
        /// 根据元数据ID数组批量删除对应的元数据记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除记录的ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int[] ids);

        /// <summary>
        /// 根据关系对象ID和类型删除对应的元数据记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="objectId">关系对象ID</param>
        /// <param name="objectType">关系对象类型(0:Post, 1:User, 2:Link, 3:Comment)</param>
        /// <param name="key">属性名称(省略该参数传入null, 默认删除全部属性)</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int objectId, int objectType, string key);
        #endregion

        #endregion

        #region 更新记录

        #region 更新一个完整对象
        /// <summary>
        /// 更新一个完整的拓展元数据对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="meta">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateMeta(Meta meta);
        #endregion

        #endregion

        #region 选取记录

        #region 选取表中主键最大值
        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        int SelectMaxId();
        #endregion

        #region 是否存在该拓展元数据属性
        /// <summary>
        /// 检查表中对应的关系对象是否已经存在该属性名称, 返回一个布尔值, 存在则为True; 不存在则为False
        /// </summary>
        /// <param name="objectId">关联对象ID</param>
        /// <param name="objectType">关系对象类型(0:Post, 1:User, 2:Link, 3:Comment)</param>
        /// <param name="key">要确定的属性名称</param>
        /// <returns>存在返回True; 不存在返回False</returns>
        bool Exists(int objectId, int objectType, string key);
        #endregion

        #region 选取全部拓展元数据集合
        /// <summary>
        /// 取出当前拓展元数据表中的所有拓展元数据信息对象集合, 如果不存在则返回null;
        /// </summary>
        /// <returns>所有拓展元数据信息对象集合</returns>
        List<Meta> SelectMetaList();
        #endregion

        #region 根据对象类型选取拓展元数据集合
        /// <summary>
        /// 根据指定关联对象类型取出当前拓展元数据表中的所有拓展元数据信息对象集合, 如果不存在则返回null;
        /// </summary>
        /// <param name="objectType">关系对象类型(0:Post, 1:User, 2:Link, 3:Comment)</param>
        /// <returns>管理对象类型的所有拓展元数据信息对象集合</returns>
        List<Meta> SelectMetaList(int objectType);
        #endregion

        #region 根据对象ID和对象类型选取拓展元数据集合
        /// <summary>
        /// 根据关系对象ID和关系对象类型取出当前类别下拓展元数据表中的所有拓展元数据信息对象集合, 如果不存在则返回null;
        /// </summary>
        /// <param name="objectId">关联对象ID</param>
        /// <param name="objectType">关系对象类型(0:Post, 1:User, 2:Link, 3:Comment)</param>
        /// <returns>指定对象的所有拓展元数据信息对象集合</returns>
        List<Meta> SelectMetaList(int objectId, int objectType);
        #endregion

        #region 根据ID选取全部拓展元数据对象
        /// <summary>
        /// 根据ID取出当前拓展元数据表中的拓展元数据对象, 如果不存在则返回null;
        /// </summary>
        /// <param name="metaid">元数据ID</param>
        /// <returns>拓展元数据对象</returns>
        Meta SelectMeta(int metaid);
        #endregion

        #region 根据关联对象ID, 类型, 键取出当前拓展元数据表中的对应的选项值
        /// <summary>
        /// 根据关联对象ID, 类型, 键取出当前拓展元数据表中的对应的选项值, 不存在则返回null
        /// </summary>
        /// <param name="objectId">关联对象ID</param>
        /// <param name="objectType">关系对象类型(0:Post, 1:User, 2:Link, 3:Comment)</param>
        /// <param name="key">属性键</param>
        /// <returns>对应的选项值</returns>
        string SelectValue(int objectId, int objectType, string key);
        #endregion

        #endregion
    }
}
